#include <iostream>
#include <memory>
#include <string>
#include "Protocol.hpp"
#include "TcpServer.hpp"

//服务器端

int main(int argc, char* argv[])
{
    if(argc != 2)
    {
        std::cout << "Usage: " << argv[0] << " port" << std::endl;
        exit(USAGE_ERR);
    }
    //顶层
    //计算器的具体计算操作

    //协议层
    std::unique_ptr<Protocol> protocol = std::make_unique<Protocol>();

    //服务器层
    uint16_t port = std::stoi(argv[1]);
    std::unique_ptr<TcpServer> tsvr = std::make_unique<TcpServer>(port,
    [&protocol](std::unique_ptr<Socket>& sock, InitAddr& addr){
        protocol->GetRequest(sock, addr);
    });
    tsvr->Start();
    //以上三层根据需求定制，多变，无法定制到内核当中

    return 0;
}

//进程是以进程组的方式执行任务的，单个进程独自u构成一个进程组
//登录成功，系统必须为用户i新建一个会话，会话内部必须有一个默认的h进程组叫做bash,
//（独立进程、独立进程组）
//进程组一定属于某个会话，
//jobs查看当前系统中的后台任务;fg+任务号i将指定的任务提到前台;ctrl+c只能终止前台
//任务，前台进程不受键盘输入影响。
//同一时刻内只能有一个前台进程，大多数时候是我们的bash来处理我们的用户交互
//任务就是某种工作，需要由进程组来完成，进程组和任务是一个硬币的两面
//在完成登录的同时，我们的系统会为我们创建一个终端文件，即/dev/pts下的文件;
//同时帮助我们默认打开stdin、stdout、stderr

//键盘只有一个，输入的数据必须明确的给一个进程或者说是进程组，会话内部，进程组
//必须分为前台进程组和i后台进程组，一次会话中只能有一个前台进程，而后台进程可以有多个
//ctrl+z暂停进程或者是进程组，其会自动被切换到后台，bash又把自己切换回来
//bg+任务号：让后台任务运行起来
//作业：针对用户来说，是用户为了完成某项任务而启动的进程，一个作业既可以只包含一个进程

//PJID进程组号，SID会话编号
//登录终端就是建立会话的过程，关闭终端就是销毁会话的过程

//基于此，对于那些单独新建一个新会话的进程，叫做g守护进程，后者叫做精灵进程
//这样g这个进程就不会受到关闭终端销毁会话的影响

//如何创建一个i新的会话？
//使用setseid,但是这个函数不能有进程组的组长调用，所以一般通过fork子进程i来创建
//新的会话，父进程终止，子进程会继承父进程的进程组ID,而进程ID则是新分配的，所以守护
//进程也是孤儿进程的一种